<html>
    <head>
        <title>捆绑贡献者  BundleContributor</title>
    </head>
    <body>
        <script>
            /*
                       四、捆绑贡献者   Bundle Contributors 

                                将文件添加到现有捆绑包似乎很有用。

                                1、如何创建捆绑贡献者？

                                            如果您需要替换包中的文件，或者您想有条件地添加文件怎么办？定义包贡献者为这种情况提供了额外的功能。

                                            eg: 将bootstrap. css替换为自定义版本的示例捆绑贡献者：

                                                    public class MyExtensionGlobalStyleContributor : BundleContributor // 继承 BundleContributor 捆绑贡献者基类

                                                    {
                                                        public override void ConfigureBundle(BundleConfigurationContext context)
                                                        {
                                                            context.Files.ReplaceOne(  // 针对所有捆绑包，替换bootstrap.css为自定义版本

                                                                "/libs/bootstrap/css/bootstrap.css",
                                                                "/styles/extensions/bootstrap-customized.css"
                                                            );
                                                        }
                                                    }


                                            然后你可以像下面一样使用这个贡献者：

                                                    
                                                    services.Configure<AbpBundlingOptions>(options =>
                                                    {
                                                        options
                                                            .ScriptBundles
                                                            .Configure("MyGlobalBundle", bundle => {
                                                                bundle.AddContributors(typeof(MyExtensionGlobalStyleContributor));  // 注册捆绑贡献者
                                                            });
                                                    });

                                            您还可以在创建新捆绑包时添加贡献者。、

                                            贡献者也可以在捆绑标签助手中使用。
                                            
                                            eg ：

                                                        <abp-style-bundle>
                                                            <abp-style type="@typeof(BootstrapStyleContributor)" />
                                                            <abp-style src="/libs/font-awesome/css/font-awesome.css" />
                                                            <abp-style src="/libs/toastr/toastr.css" />
                                                        </abp-style-bundle>

                                            abp-style和abp-script标签可以获得type属性（而不是src属性），如本示例所示。
                                            
                                            当您添加包贡献者时，它的依赖项也会自动添加到包中。


                                2、捆绑贡献者依赖

                                            捆绑包贡献者可以对其他贡献者有一个或多个依赖关系。
                                            
                                            eg：
                                                [DependsOn(typeof(MyDependedBundleContributor))] //Define the dependency
                                                public class MyExtensionStyleBundleContributor : BundleContributor
                                                {
                                                    //...
                                                }   
                                                    
                                            添加包贡献者时，其依赖项会自动递归添加。

                                            通过防止重复，通过依赖顺序添加的依赖项。

                                            即使它们在单独的包中，也会阻止重复。

                                            ABP将所有包组织在一个页面中并消除重复。

                                            创建贡献者和定义依赖关系是"跨不同模块"组织捆绑包创建的一种方式。

                                3、捆绑贡献者扩展

                                            在某些高级场景中，每当使用捆绑贡献者时，您可能需要进行一些额外的配置。

                                            使用扩展贡献者时，贡献者扩展可以无缝工作。

                                            下面的示例为prms. js库添加了一些样式：

                                                  public class MyPrismjsStyleExtension : BundleContributor
                                                {
                                                    public override void ConfigureBundle(BundleConfigurationContext context)
                                                    {
                                                        context.Files.AddIfNotContains("/libs/prismjs/plugins/toolbar/prism-toolbar.css");
                                                    }
                                                } 
                                                    
                                            然后可以配置AbpBundleContributorOptions来扩展现有的PrismjsStyleBundleContributor

                                                Configure<AbpBundleContributorOptions>(options =>
                                                {
                                                    options
                                                        .Extensions<PrismjsStyleBundleContributor>()
                                                        .Add<MyPrismjsStyleExtension>();
                                                });

                                            每当PrismjsStyleBundleContributor被添加到包中时，MyPrismjsStyleExtension也会被自动添加。


                                4、访问IServiceProvider

                                            虽然很少需要，但BundleConfigurationContext有一个ServiceProvider属性，您可以在ConfigureBundle方法中解析服务依赖关系。


                                5、标准包贡献者 Standard Package Contributors

                                           将特定的NPM包资源（js、css文件）添加到包中非常简单。 

                                           例如，你总是为 bootstrap NPM包(标准包)添加 bootstrap.css 文件。

                                           所有标准NPM包都有内置贡献者。例如，如果您的贡献者依赖于引导程序，您可以直接声明它，而不是自己添加bootstrap. css。

                                                    [DependsOn(typeof(BootstrapStyleContributor))] //声明对 bootstrap.css 的依赖
                                                    public class MyExtensionStyleBundleContributor : BundleContributor
                                                    {
                                                        //...
                                                    }

                                            为标准包使用内置贡献者的优点：

                                                    ①、防止您键入无效的资源路径。

                                                    ②、如果资源路径更改（依赖的贡献者将处理它），则防止更改您的贡献者。

                                                    ③、防止多个模块添加重复文件。

                                                    ④、递归管理依赖项（如有必要，添加依赖项的依赖项）。

                                6、Volo. Abp.AspNetCore.Mvc.UI.Packages 包  
                                
                                             这个包已经默认安装在启动模板中。所以，大多数时候，你不需要手动安装它。
                                             
                                             如果您不使用启动模板，您可以使用ABP CLI将其安装到您的项目中。在包含项目的. csproj文件的文件夹中执行以下命令：

                                                    "abp add-package Volo.Abp.AspNetCore.Mvc.UI.Packages"

                                7、捆绑包继承
                                
                                            在某些特定情况下，可能需要创建一个从其他包继承的新包。

                                            从捆绑包继承（递归）继承该捆绑包的所有文件/贡献者。

                                            然后派生的捆绑包可以添加或修改文件/贡献者而无需修改原始捆绑包。
                                            
                                            示例：
                                                            
                                                services.Configure<AbpBundlingOptions>(options =>
                                                {
                                                    options
                                                        .StyleBundles
                                                        .Add("MyTheme.MyGlobalBundle", bundle => {
                                                            bundle
                                                                .AddBaseBundles("MyGlobalBundle") //Can add multiple
                                                                .AddFiles(
                                                                    "/styles/mytheme-global-styles.css"
                                                                );
                                                        });
                                                });
                    */
        </script>
    </body>
</html>